package com.siam.package_weixin_pay.entity;

import com.google.gson.annotations.SerializedName;
import lombok.Data;

import java.util.Objects;
 
/**
 * 商户单号查询转账单实体类信息
 *
 * @author: suhai
 * @date: 2025/05/13  11:28
 */
@Data
public class TransferDetailEntityNew {

    public static final String STATE_SUCCESS = "SUCCESS";
    public static final String STATE_FAIL = "FAIL";
    public static final String STATE_CANCELLED = "CANCELLED";

    /** 商户号 Y 说明：微信支付分配的商户号 */
    @SerializedName("mch_id")
    private String mchId;
 
    /** 商户单号 Y 说明：商户系统内部的商家单号，要求此参数只能由数字、大小写字母组成，在商户系统内部唯一 */
    @SerializedName("out_bill_no")
    private String outBillNo;
 
    /** 商家转账订单号 Y 说明：商家转账订单的主键，唯一定义此资源的标识 */
    @SerializedName("transfer_bill_no")
    private String transferBillNo;
 
    /** 商户appid Y 说明：申请商户号的appid或商户号绑定的appid（企业号corpid即为此appid） */
    @SerializedName("appid")
    private String appid;
 
    /** 单据状态 Y 说明：单据状态  */
    @SerializedName("state")
    private String state;
 
    /** 转账金额 Y 说明：转账金额单位为“分”。*/
    @SerializedName("transfer_amount")
    private Integer transferAmount;
 
    /** 转账备注 Y 说明：转账备注，用户收款时可见该备注信息，UTF8编码，最多允许32个字符。*/
    @SerializedName("transfer_remark")
    private String transferRemark;
 
    /** 失败原因 N 说明：订单已失败或者已退资金时，返回失败原因。 */
    @SerializedName("fail_reason")
    private String failReason;
 
    /** 收款用户OpenID Y 说明：商户AppID下，某用户的OpenID  */
    @SerializedName("openid")
    private String openid;
 
    /** 收款用户姓名 N 说明：收款方真实姓名。需要加密传入，支持标准RSA算法和国密算法，公钥由微信侧提供。
     转账金额 >= 2,000元时，该笔明细必须填写
     若商户传入收款用户姓名，微信支付会校验收款用户与输入姓名是否一致，并提供电子回单 */
    @SerializedName("user_name")
    private String userName;
 
    /** 单据创建时间 N 说明：单据受理成功时返回，按照使用rfc3339所定义的格式，格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */
    @SerializedName("create_time")
    private String createTime;
 
    /** 最后一次状态变更时间 N 说明：单据最后更新时间，按照使用rfc3339所定义的格式，格式为yyyy-MM-DDThh:mm:ss+TIMEZONE */
    @SerializedName("update_time")
    private String updateTime;
 
    public String getMchId() {
        return mchId;
    }
 
    public void setMchId(String mchId) {
        this.mchId = mchId;
    }
 
    public String getOutBillNo() {
        return outBillNo;
    }
 
    public void setOutBillNo(String outBillNo) {
        this.outBillNo = outBillNo;
    }
 
    public String getTransferBillNo() {
        return transferBillNo;
    }
 
    public void setTransferBillNo(String transferBillNo) {
        this.transferBillNo = transferBillNo;
    }
 
    public String getAppid() {
        return appid;
    }
 
    public void setAppid(String appid) {
        this.appid = appid;
    }
 
    public String getState() {
        return state;
    }
 
    public void setState(String state) {
        this.state = state;
    }
 
    public Integer getTransferAmount() {
        return transferAmount;
    }
 
    public void setTransferAmount(Integer transferAmount) {
        this.transferAmount = transferAmount;
    }
 
    public String getTransferRemark() {
        return transferRemark;
    }
 
    public void setTransferRemark(String transferRemark) {
        this.transferRemark = transferRemark;
    }
 
    public String getFailReason() {
        return failReason;
    }
 
    public void setFailReason(String failReason) {
        this.failReason = failReason;
    }
 
    public String getOpenid() {
        return openid;
    }
 
    public void setOpenid(String openid) {
        this.openid = openid;
    }
 
    public String getUserName() {
        return userName;
    }
 
    public void setUserName(String userName) {
        this.userName = userName;
    }
 
    public String getCreateTime() {
        return createTime;
    }
 
    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
 
    public String getUpdateTime() {
        return updateTime;
    }
 
    public void setUpdateTime(String updateTime) {
        this.updateTime = updateTime;
    }
 
    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) return false;
        TransferDetailEntityNew that = (TransferDetailEntityNew) o;
        return Objects.equals(mchId, that.mchId) && Objects.equals(outBillNo, that.outBillNo) && Objects.equals(transferBillNo, that.transferBillNo) && Objects.equals(appid, that.appid) && Objects.equals(state, that.state) && Objects.equals(transferAmount, that.transferAmount) && Objects.equals(transferRemark, that.transferRemark) && Objects.equals(failReason, that.failReason) && Objects.equals(openid, that.openid) && Objects.equals(userName, that.userName) && Objects.equals(createTime, that.createTime) && Objects.equals(updateTime, that.updateTime);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(mchId, outBillNo, transferBillNo, appid, state, transferAmount, transferRemark, failReason, openid, userName, createTime, updateTime);
    }
 
    @Override
    public String toString() {
        return "TransferDetailEntityNew{" +
                "mchId='" + mchId + '\'' +
                ", outBillNo='" + outBillNo + '\'' +
                ", transferBillNo='" + transferBillNo + '\'' +
                ", appid='" + appid + '\'' +
                ", state='" + state + '\'' +
                ", transferAmount=" + transferAmount +
                ", transferRemark='" + transferRemark + '\'' +
                ", failReason='" + failReason + '\'' +
                ", openid='" + openid + '\'' +
                ", userName='" + userName + '\'' +
                ", createTime='" + createTime + '\'' +
                ", updateTime='" + updateTime + '\'' +
                '}';
    }
 
//    public TransferDetailEntityNew cloneWithCipher(PrivacyDecryptor encryptor) {
//        TransferDetailEntityNew copy = new TransferDetailEntityNew();
//        copy.mchId = mchId;
//        copy.outBillNo = outBillNo;
//        copy.transferBillNo = transferBillNo;
//        copy.appid = appid;
//        copy.state = state;
//        copy.transferAmount = transferAmount;
//        copy.transferRemark = transferRemark;
//        copy.failReason = failReason;
//        copy.openid = openid;
//        if (userName != null && !userName.isEmpty()) {
//            copy.userName = encryptor.decrypt(userName);
//        }
//        copy.createTime = createTime;
//        copy.updateTime = updateTime;
//        return copy;
//    }
}
 
 